# This file will contain the web routes (URLs) for the application.
from flask import Blueprint, jsonify, request, render_template
from . import services
from .models import Signal
import json

# 创建一个蓝图，不再指定URL前缀
main_bp = Blueprint('main', __name__)

@main_bp.route('/')
def index():
    """
    修改后的首页路由。
    1. 从数据库加载所有现存的信号。
    2. 将信号数据格式化为与前端JS兼容的格式。
    3. 将数据作为JSON字符串传递给模板，供页面初始化时使用。
    """
    signals = Signal.query.order_by(Signal.signal_date.desc(), Signal.stock_code.asc()).all()
    
    # 核心：构建与前端JS渲染函数兼容的数据结构
    signals_data = []
    for i, s in enumerate(signals):
        signal_dict = {
            'id': s.id,
            'stock_code': s.stock_code,
            'signal_date': s.signal_date.strftime('%Y-%m-%d'),
            # 修复：转换status为前端期望的格式
            'status': 'Tested' if s.status == 'tested' else 'Untested',
            # 核心：传递原始pnl_pct数字，而不是格式化后的字符串
            'pnl_pct': s.pnl_pct,
            '序号': i + 1,
            # 前端JS渲染时会提供默认值，这里设为None即可
            'buy_date': None,
            'sell_date': None,
            'pnl': None
        }
        signals_data.append(signal_dict)
        
    return render_template('index.html', initial_signals_json=json.dumps(signals_data))

@main_bp.route('/api/status')
def status():
    # 返回一个简单的JSON响应
    return jsonify({"status": "ok", "service": "webapp"})

@main_bp.route('/api/ping-engine')
def ping_engine():
    # 调用服务层函数来ping引擎
    response = services.ping_engine()
    return jsonify(response)

@main_bp.route('/api/get_config', methods=['GET'])
def get_config():
    """
    API endpoint to get the configuration from the engine.
    """
    config = services.get_config_service()
    if 'error' in config:
        return jsonify(config), 500
    return jsonify(config)

@main_bp.route('/api/run_signal_generation', methods=['POST'])
def run_signal_generation():
    """
    API endpoint to run the signal generation process.
    """
    data = request.get_json()
    force_recache = data.get('forceRecache', False)
    
    # 我们假设配置就是请求体本身
    config = data
    
    result = services.run_signal_generation_service(config, force_recache=force_recache)
    
    # 服务层现在可能返回一个元组 (data, status_code)
    # 我们需要检查返回值的类型
    if isinstance(result, tuple):
        response_data, status_code = result
        return jsonify(response_data), status_code
    
    # 兼容旧的只返回字典的情况
    if 'error' in result:
        return jsonify(result), 500
        
    return jsonify(result)

@main_bp.route('/api/get_signal_details/<int:signal_id>', methods=['GET'])
def get_signal_details(signal_id):
    """
    新的API端点，用于获取单个信号的详细回测数据。
    """
    print(f"--- [API Route] 接到对 Signal ID: {signal_id} 的详情请求，转交服务层处理 ---")
    response, status_code = services.get_signal_details_service(signal_id)
    return jsonify(response), status_code